package com.mmy.service.train.impl;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.alibaba.fastjson.JSON;
import com.mmy.controller.Common;
import com.mmy.controller.UtilConstants;
import com.mmy.dao.sys.TSysTogetherRepository;
import com.mmy.dao.sys.TSysUserRepository;
import com.mmy.dao.train.TrainOrderRepository;
import com.mmy.dao.train.TrainPlanRepository;
import com.mmy.dao.train.VTrainOrderRepository;
import com.mmy.domain.sys.TSysTogether;
import com.mmy.domain.sys.TSysUser;
import com.mmy.domain.train.TTrainOrder;
import com.mmy.domain.train.TTrainPlan;
import com.mmy.domain.train.VTrainOrder;
import com.mmy.service.ServiceCommon;
import com.mmy.service.train.TrainOrderService;

@Service
public class TrainOrderServiceImpl implements TrainOrderService {

	@Autowired
	TrainOrderRepository trainOrderRepository;
	@Autowired
	TrainPlanRepository trainPlanRepository;
	@Autowired
	VTrainOrderRepository vTrainOrderRepository;
	@Autowired
	ServiceCommon common;
	@Autowired
	TSysUserRepository tSysUserRepository;
	@Autowired
	TSysTogetherRepository tSysTogetherRepository;

	/**
	 * 获取最大流水号
	 * 
	 * @return 返回值说明 流水号
	 * @author 创建人 dingxd
	 * @date 创建日期 2020.11.17
	 */
	public int getMaxID() {
		// 流水号
		Object objCode = trainOrderRepository.getMaxID();
		int iID = 0;
		if (objCode != null) {
			iID = Integer.parseInt(objCode.toString());
		}
		return iID;
	}

	/**
	 * 获取订单最大编码
	 * 
	 * @param 参数说明 计划单编码
	 * @return 返回值说明 订单编码
	 * @author 创建人 dingxd
	 * @date 创建日期 2020.11.17
	 */
	public String getMaxCode(int iPlanID) {
		// int 转 string
		String strPlanID = String.valueOf(iPlanID);
		// 返回订单最大编码
		Object objCode = trainOrderRepository.getMaxCode(strPlanID);
		String strCode = "";
		if (objCode != null) {
			strCode = objCode.toString();
		}
		return strCode;
	}

	/**
	 * 新增id
	 * 
	 * @param
	 * @return
	 */
	public void save(int id) {
		// TODO Auto-generated method stub
		trainOrderRepository.save(id);
	}

	/**
	 * 新增订单
	 * 
	 * @param
	 * @return
	 */
	public void save(TTrainOrder tTrainOrder) {
		// TODO Auto-generated method stub
		trainOrderRepository.save(tTrainOrder);
	}

	/**
	 * id查找
	 * 
	 * @param
	 * @return
	 */
	public List<VTrainOrder> findByTrainID(int iTrainID) {
		// TODO Auto-generated method stub
		return vTrainOrderRepository.findByTrainID(iTrainID);
	}

	/**
	 * 删除预留
	 * 
	 * @param
	 * @return
	 */
	public void delTrainOrder(List<Integer> lstID) {
		// TODO Auto-generated method stub
		trainOrderRepository.delTrainOrder(lstID);
	}

	/**
	 * 出纳查询
	 * 
	 * @param
	 * @return
	 */
	public List<VTrainOrder> findByCashierAndTrainID(String strCashierState, int iTrainID) {
		// TODO Auto-generated method stub
		return vTrainOrderRepository.findByCashierAndTrainID(strCashierState, iTrainID);
	}

	/**
	 * 查找全部
	 * 
	 * @param
	 * @return
	 */
	public List<VTrainOrder> findAll() {
		// TODO Auto-generated method stub
		return vTrainOrderRepository.findAll();
	}

	/**
	 * 会计查询
	 * 
	 * @param
	 * @return
	 */
	public List<VTrainOrder> findByAccountAndTrainID(String strAccountState, int iTrainID) {
		// TODO Auto-generated method stub
		return vTrainOrderRepository.findByAccountAndTrainID(strAccountState, iTrainID);
	}

	public void saveAll(List<TTrainOrder> lstCashier) {
		// TODO Auto-generated method stub
		trainOrderRepository.saveAll(lstCashier);
	}

	/**
	 * 个人中心通过登录人获取专列预留 获取分页
	 *
	 * @author 创建人 hanxl 整理
	 * @date 创建日期 2020.10.29
	 */
	public HashMap<String, Integer> mapTrainReserve(String pageNumber, String pageSize, int iUserID) {
		Common common = new Common();
		HashMap<String, Integer> mapPage = new HashMap<String, Integer>();
		mapPage = common.getPage(pageNumber, pageSize, trainOrderRepository.countByUserID(iUserID));
		return mapPage;
	}

	/**
	 * 个人中心通过登录人获取专列退单 获取分页
	 *
	 * @author 创建人 hanxl 整理
	 * @date 创建日期 2020.10.29
	 */
	public HashMap<String, Integer> mapTrainRefund(String pageNumber, String pageSize, int iUserID) {
		Common common = new Common();
		HashMap<String, Integer> mapPage = new HashMap<String, Integer>();
		mapPage = common.getPage(pageNumber, pageSize, trainOrderRepository.countByRefundUserID(iUserID));
		return mapPage;
	}

	/**
	 * 个人中心通过登录人获取专列订单 获取分页
	 *
	 * @author 创建人 hanxl 整理
	 * @date 创建日期 2020.10.29
	 */
	public HashMap<String, Integer> mapTrainOrder(String pageNumber, String pageSize, int iUserID) {
		Common common = new Common();
		HashMap<String, Integer> mapPage = new HashMap<String, Integer>();
		mapPage = common.getPage(pageNumber, pageSize, trainOrderRepository.countByOrderUserID(iUserID));
		return mapPage;
	}

	/**
	 * 个人中心通过登录人获取列车票预留
	 *
	 * @author 创建人 hanxl 整理
	 * @date 创建日期 2020.10.29
	 */
	public List<TTrainOrder> findByUserID(String pageNumber, String pageSize, int iUserID) {
		int iPageSize = 0;
		int iTempPageNo = 0;
		if (pageNumber == null) {
			pageNumber = "1";
		}
		if (pageSize == null) {
			iPageSize = 20;
		} else {
			iPageSize = Integer.valueOf(pageSize);
			iTempPageNo = (Integer.valueOf(pageNumber) - 1) * iPageSize;
		}
		List<TTrainOrder> lstTrainOrder = new ArrayList<TTrainOrder>();
		lstTrainOrder = trainOrderRepository.findByUserID(iUserID, iTempPageNo, iPageSize);
		return lstTrainOrder;
	}

	/**
	 * 个人中心通过登录人获取列车票订单
	 *
	 * @author 创建人 hanxl 整理
	 * @date 创建日期 2020.10.29
	 */
	public List<TTrainOrder> findByOrderUserID(String pageNumber, String pageSize, int iUserID) {
		int iPageSize = 0;
		int iTempPageNo = 0;
		if (pageNumber == null) {
			pageNumber = "1";
		}
		if (pageSize == null) {
			iPageSize = 20;
		} else {
			iPageSize = Integer.valueOf(pageSize);
			iTempPageNo = (Integer.valueOf(pageNumber) - 1) * iPageSize;
		}
		List<TTrainOrder> lstTrainOrder = new ArrayList<TTrainOrder>();
		lstTrainOrder = trainOrderRepository.findByOrderUserID(iUserID, iTempPageNo, iPageSize);
		return lstTrainOrder;
	}

	/**
	 * 个人中心通过登录人获取列车票退单
	 *
	 * @author 创建人 hanxl 整理
	 * @date 创建日期 2020.10.29
	 */
	public List<TTrainOrder> findByChargeBackUserID(String pageNumber, String pageSize, int iUserID) {
		int iPageSize = 0;
		int iTempPageNo = 0;
		if (pageNumber == null) {
			pageNumber = "1";
		}
		if (pageSize == null) {
			iPageSize = 20;
		} else {
			iPageSize = Integer.valueOf(pageSize);
			iTempPageNo = (Integer.valueOf(pageNumber) - 1) * iPageSize;
		}
		List<TTrainOrder> lstTrainOrder = new ArrayList<TTrainOrder>();
		lstTrainOrder = trainOrderRepository.findByChargeBackUserID(iUserID, iTempPageNo, iPageSize);
		return lstTrainOrder;
	}

	/**
	 * 个人中心通过登录人取消专列预留
	 *
	 * @author 创建人 hanxl 整理
	 * @date 创建日期 2020.10.29
	 */
	public void updateState(int iID, TSysUser sessionSysUser) {
		// TODO Auto-generated method stub
		TTrainOrder dbTrainOrder = trainOrderRepository.findByID(iID);
		dbTrainOrder.setOrderState((byte) 3);
		dbTrainOrder.setModifyDate(new Date());
		dbTrainOrder.setReviser(sessionSysUser.getUserName());
		trainOrderRepository.save(dbTrainOrder);
	}

	/**
	 * 个人中心通过登录人申请专列退单
	 *
	 * @author 创建人 hanxl 整理
	 * @date 创建日期 2020.10.29
	 */
	public void updateRefundState(int iID, TSysUser sessionSysUser) {
		// TODO Auto-generated method stub
		TTrainOrder dbTrainOrder = trainOrderRepository.findByID(iID);
		dbTrainOrder.setOrderState((byte) 4);
		dbTrainOrder.setRefundProcess((byte) 1);
		dbTrainOrder.setModifyDate(new Date());
		dbTrainOrder.setReviser(sessionSysUser.getUserName());
		trainOrderRepository.save(dbTrainOrder);
	}

	/**
	 * 个人中心通过登录人点击撤销专列退单
	 *
	 * @author 创建人 hanxl 整理
	 * @date 创建日期 2020.10.29
	 */
	public void updateCancelState(int iID, TSysUser sessionSysUser) {
		// TODO Auto-generated method stub
		TTrainOrder dbTrainOrder = trainOrderRepository.findByID(iID);
		dbTrainOrder.setOrderState((byte) 2);
		dbTrainOrder.setRefundProcess((byte) 0);
		dbTrainOrder.setModifyDate(new Date());
		dbTrainOrder.setReviser(sessionSysUser.getUserName());
		trainOrderRepository.save(dbTrainOrder);
	}

	/**
	 * 通过订单ID查询
	 *
	 * @author 创建人 hanxl 整理
	 * @date 创建日期 2020.10.29
	 */
	public TTrainOrder findByID(int iID) {
		// TODO Auto-generated method stub
		return trainOrderRepository.findByID(iID);
	}

	/**
	 * 前台机票创建订单
	 *
	 * @author 创建人 hanxl
	 * @param strOrderTel
	 * @param strOrderName
	 * @date 创建日期 2021.03.17
	 */
	public Map<String, Object> createOrderTrain(String strPlanID, String strNumber, String strTrainOrder,
			TSysUser sessionSysUser) {
		// 处理order
		List<TTrainOrder> lstTrainOrder = JSON.parseArray(strTrainOrder, TTrainOrder.class);
		TTrainPlan dbTrainPlan = trainPlanRepository.findByPlanID(Integer.parseInt(strPlanID));
		BigDecimal price = dbTrainPlan.getPrice();
		int num = Integer.parseInt(strNumber);
		// 订单根据预留数量减少
		int count = dbTrainPlan.getNumber() - num;
		dbTrainPlan.setNumber(count);
		dbTrainPlan.setModifyDate(new Date());
		dbTrainPlan.setReviser(sessionSysUser.getUserName());
		trainPlanRepository.save(dbTrainPlan);
		BigDecimal sum = price.multiply(BigDecimal.valueOf(num));

		Map<String, Object> data = new HashMap<>();
		List<Integer> lstID = new ArrayList<Integer>();
		for (TTrainOrder tTrainOrder : lstTrainOrder) {
			int iPlanID = Integer.valueOf(tTrainOrder.getOrderID());
			// 获取 流水号
			tTrainOrder.setID(common.createMaxID(UtilConstants.TableName.T_TRAIN_ORDER));
			// 获取 订单号
			String cOrderID = common.createOrderCode(UtilConstants.TableName.T_TRAIN_ORDER, iPlanID);
			tTrainOrder.setOrderID(cOrderID);
			// 订单ID已存在=planID
			// 预留操作人
			tTrainOrder.setReserveUserID(sessionSysUser.getUserID());
			// 预留人姓名
			tTrainOrder.setReserveName(sessionSysUser.getUserName());
			// 预留人手机号
			tTrainOrder.setReserveTel(sessionSysUser.getUserMobile());
			// 预留日期
			tTrainOrder.setReserveDate(new Date());
			// 订单操作人
			tTrainOrder.setOrderUserID(sessionSysUser.getUserID());
			// 订单日期
			tTrainOrder.setOrderDate(new Date());
			// 订单人姓名、订单人电话、身份证号已存在
			// 同行人问题
			if (sessionSysUser.getUserType() == (byte) 0) {

				// 第一步查询身份证号码是否存在
				TSysUser dbSysUser = tSysUserRepository.findByIdentity(tTrainOrder.getIdentity());
				// 获得用户ID
				TSysUser tSysUser = new TSysUser();
				int iUserID = 0;
				// 如果等于空 在用户表里创建该用户
				if (dbSysUser == null) {

					tSysUser.setUserID(common.createBaseCode(UtilConstants.TableName.T_SYS_USER));
					// 默认账号和密码
					String strUserAccount = "visitor" + tSysUser.getUserID();
					tSysUser.setUserAccount(strUserAccount);
					tSysUser.setPassWord("123456");
					tSysUser.setUserName(tTrainOrder.getOrderName());
					tSysUser.setIdentity(tTrainOrder.getIdentity());
					// 用户推荐人为登录人
					tSysUser.setUpUserID(sessionSysUser.getUserID());
					// 用户所属公司为登陆人所属公司
					tSysUser.setOrgID(sessionSysUser.getOrgID());
					tSysUser.setCreator(sessionSysUser.getUserName());
					tSysUser.setCreateDate(new Date());
					tSysUserRepository.save(tSysUser.getUserID());
					tSysUserRepository.save(tSysUser);
					// 如果为空 获取创建的用户的ID
					iUserID = tSysUser.getUserID();
				} else {

					// 如果不为空，获得用户的ID
					iUserID = dbSysUser.getUserID();
				}

				// 查询同行人表中是否已存在该出行人和同行人
				TSysTogether dbSysTogether = tSysTogetherRepository.findByUserIDAndPeerID(sessionSysUser.getUserID(),
						iUserID);
				// 如果为空 创建同行人表
				if (dbSysTogether == null) {
					// 获得用户ID
					TSysTogether tSysTogether = new TSysTogether();

					tSysTogether.setID(common.createMaxID(UtilConstants.TableName.T_SYS_TOGETHER));
					tSysTogether.setUserID(sessionSysUser.getUserID());
					tSysTogether.setPeerID(iUserID);

					tSysTogether.setCreator(sessionSysUser.getUserName());
					tSysTogether.setCreateDate(new Date());
					tSysTogetherRepository.save(tSysTogether.getID());
					tSysTogetherRepository.save(tSysTogether);
				}
			}
			// 订单状态为1 正式订单
			tTrainOrder.setOrderState((byte) 1);

			// 订单总额
			tTrainOrder.setOrderAmount(sum);

			// 订单底价、同业价、售价 从计划里获取
			tTrainOrder.setFloor(dbTrainPlan.getFloor());
			tTrainOrder.setPeer(dbTrainPlan.getPeer());
			tTrainOrder.setPrice(dbTrainPlan.getPrice());
			// 创建登录人登录时间
			tTrainOrder.setCreator(sessionSysUser.getUserName());
			tTrainOrder.setCreateDate(new Date());
			// 创建订单
			trainOrderRepository.save(tTrainOrder.getID());
			trainOrderRepository.save(tTrainOrder);
			lstID.add(tTrainOrder.getID());
		}
		data.put("lstID", lstID);
		return data;
	}

	/**
	 * 函数功能说明：收据提交
	 *
	 * @param 参数说明
	 * @return 返回值说明 jsp页面
	 * @author 创建人 shangzl 修改人hanxl
	 * @date 创建日期 2021.01.12
	 */

	public List<TTrainOrder> updateTrainOrder(TTrainOrder tTrainOrder, TSysUser sessionSysUser, String lstID) {
		// 拆分字符串
		String[] arrID = lstID.split(",");
		List<TTrainOrder> lstTrainOrder = new ArrayList<TTrainOrder>();
		for (int i = 0; i < arrID.length; i++) {
			// 定义一个新的实体类对象
			TTrainOrder dbTrainOrder = trainOrderRepository.findByID(Integer.parseInt(arrID[i]));
			dbTrainOrder.setPayType(tTrainOrder.getPayType());

			dbTrainOrder.setReceivable(tTrainOrder.getReceivable());
			dbTrainOrder.setVoucher(tTrainOrder.getVoucher());
			dbTrainOrder.setReceipt(tTrainOrder.getReceipt());
			if (tTrainOrder.getReceivable() == tTrainOrder.getReceipt()) {
				dbTrainOrder.setOrderState((byte) 2);
			}
			dbTrainOrder.setModifyDate(new Date());
			dbTrainOrder.setReviser(sessionSysUser.getUserName());
			trainOrderRepository.save(dbTrainOrder);
			lstTrainOrder.add(dbTrainOrder);
		}
		return lstTrainOrder;
	}

}
